﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;

namespace TMS
{
    #region SINGLETON

    public class TesterXMLManager : XMLBaseManager
    {
        private static TesterXMLManager _instancia;

        public static TesterXMLManager getInstancia()
        {
            if (_instancia == null)
            {
                _instancia = new TesterXMLManager();
            }
            return _instancia;
        }
    #endregion

        #region CONSTRUCTORES
        private TesterXMLManager()
        {
            nombreRoot = "Testers";
            nombreArchivo = nombreRoot + ".xml";
        }

        #endregion

        #region METODOS

        public void addTester(Tester pTester)
        {
            long idTester;
            Usuario us = UsuarioXMLManager.getInstancia().getUsuarioById(pTester.NroUsuario);
            if (us == null)
            {
                idTester = UsuarioXMLManager.getInstancia().addUsuario((Usuario)pTester);
            }
            else
            {
                idTester = us.NroUsuario;
            }
            XDocument xDoc = loadDoc(); //Carga el documento.
            XElement testers = xDoc.Root; //Obtiene la raiz del documento XML.
            XElement tester = new XElement("Tester"); //Genera un nuevo elemento.
            tester.SetAttributeValue("IdUsuario", "" + idTester);
            testers.Add(tester);
            saveDoc(xDoc);

        }
        public void updateTester(Tester pTester)
        {
            UsuarioXMLManager.getInstancia().updateUsuario((Usuario)pTester);
            XDocument xDoc = loadDoc(); //Carga el documento.
            XElement testers = xDoc.Root; //Obtiene la raiz del documento XML.
            XElement xEl = null;
            try
            {
                xEl = testers.Elements().Single(d => (long)d.Attribute("IdUsuario") == pTester.NroUsuario);
            }
            catch (InvalidOperationException)
            {
                //Si el tester no esta registrado...
                if (xEl == null)
                {
                    //Se crea uno nuevo registro.
                    XElement tester = new XElement("Tester"); //Genera un nuevo elemento.
                    tester.SetAttributeValue("IdUsuario", "" + pTester.NroUsuario);
                    testers.Add(tester);
                    saveDoc(xDoc);
                }
            }
        }
        public void removeByIdUsuario(long pId)
        {
            /*
              * Elimina el elemento del documento XML Testers, pero no del documento Usuarios.
              */
            XDocument xDoc = loadDoc();
            XElement elemento = xDoc.Root.Elements().Single(a => (long)a.Attribute("IdUsuario") == pId);
            elemento.Remove();
            saveDoc(xDoc);
            /*Elimina al usuario al que se relaciona del documento Usuarios.xml*/
            /*UsuarioXMLManager.getInstancia().removeById(pId);*/
        }
        public bool existsById(long pId)
        {
            bool existe = false;
            XDocument xDoc = loadDoc();
            try
            {
                XElement elementos = xDoc.Root.Elements().Single(a => (long)a.Attribute("IdUsuario") == pId);
                if (elementos != null)
                {
                    existe = true;
                }
            }
            catch (InvalidOperationException)
            {
            }
            return existe;
        }
        #endregion
    }
}